## 第03课 巡线传感器

### （1）项目介绍：

![](media/image1.png)

循迹传感器实际上是红外传感器。 此处使用的组件是TCRT5000红外管。

其工作原理是利用红外光对颜色的不同反射率，然后将反射信号的强度转换为电流信号。

在检测过程中，黑色在高电平时处于活动状态，而白色在低电平时处于活动状态。 检测高度为0-3厘米。

KEYES三路循迹模块在一块板上集成了三个TCRT5000红外管，接线和控制更加方便。

通过旋转传感器上的可调电位器，可以调节传感器的检测灵敏度。

### （2）参数：

工作电压：3.3-5V（DC）

接口：5PIN

输出信号：数字信号

检测高度：0-3厘米

特别说明：在测试之前，请旋转传感器上的电位器以调整检测灵敏度。 当将LED调整在ON和OFF之间的阈值时，灵敏度是最好的。

![](media/image2.png)

### （3） 项目组件：

| Keyes Uno Plus 开发板 红色环保*1 | Keyes brick L298P 电机驱动扩展板 V1*1 | keyes 草帽LED白发红模块*1 | Keyes connectors 循迹传感器*1 |
| --- | --- | --- | --- |
| <img src="media/image3.png" width="200"> | <img src="media/image4.png" width="200"> | <img src="media/image5.png" width="200"> | <img src="media/image6.png" width="200"> |
| XH2.54转PH2.0 5P 连接线*1 | 3Pin 双母头杜邦线*1 | USB线*1 | 18650双节电池盒*1<br />（电池 *2自配） |
| <img src="media/image8.png" width="200"> | <img src="media/image9.jpg" width="200"> | <img src="media/image10.png" width="200"> | <img src="media/image11.png" width="200"> |

### （4）接线图:

![](media/image13.png)

循迹传感器接扩展板的D11、D7、D8引脚（左11，中7，右8）。

### （5）项目代码：

```cpp
/*
  keyes 4WD 多功能智能车
  课程 3.1
  线路跟踪传感器
  http://www.keyes-robot.com
*/

#define L_PIN 11  // 左侧线路跟踪传感器引脚
#define M_PIN 7   // 中间线路跟踪传感器引脚
#define R_PIN 8   // 右侧线路跟踪传感器引脚

int valL, valM, valR;  // 三个传感器的变量值

/* 功能：初始化串口和传感器引脚 */
void setup() {
  Serial.begin(9600);  // 初始化串口通信，波特率 9600
  pinMode(L_PIN, INPUT);  // 设置左传感器引脚为输入
  pinMode(M_PIN, INPUT);  // 设置中传感器引脚为输入
  pinMode(R_PIN, INPUT);  // 设置右传感器引脚为输入
}

/* 功能：读取传感器值并通过串口输出 */
void loop() {
  valL = digitalRead(L_PIN);  // 读取左传感器值
  valM = digitalRead(M_PIN);  // 读取中传感器值
  valR = digitalRead(R_PIN);  // 读取右传感器值

  Serial.print("left: "); Serial.print(valL);  // 输出左传感器值
  Serial.print(" middle: "); Serial.print(valM);  // 输出中传感器值
  Serial.print(" right: "); Serial.println(valR);  // 输出右传感器值并换行

  delay(500);  // 延时 500 毫秒，保证读取稳定
}
```


### （6）项目结果：

上传代码带开发板，打开串口监视，可以看到左中右三个循迹传感器的状态，如果我们用白纸去遮挡传感器，传感器的状态都是0。在没有接收到信号的时候，三个传感器都是高电平状态，显示的数值是1。

![](media/image14.png)

### （7）代码说明：

**Serial.begin(9600)**-初始化串口,串口通信波特率为9600  ，

**pinMode-**定义单片机PIN脚模式是输入还是输出，input是输入，output是输出，

**digitalRead-**读取引脚电平状态，一般有两种状态，HIGH或者LOW。

### （8）项目拓展：

上面我们了解了循迹传感器的工作原理，接下来我们在第9脚接上一个LED 灯，然后通过读取循迹传感器的状态，来控制LED的亮和灭。如下图接线：

![](media/image15.png)

我们开始来编写代码：

**示例代码 2（KE0165_3.2.ino）：**

```cpp
/*
  keyes 4WD 多功能智能车
  课程 3.2
  线路跟踪传感器
  http://www.keyes-robot.com
*/

#define L_PIN 11      // 左侧线路跟踪传感器引脚
#define M_PIN 7       // 中间线路跟踪传感器引脚
#define R_PIN 8       // 右侧线路跟踪传感器引脚
#define LED_PIN 9     // LED 灯引脚

int valL, valM, valR;  // 三个传感器的变量值

/* 功能：初始化串口和引脚模式 */
void setup() {
  Serial.begin(9600);           // 初始化串口通信，波特率 9600
  pinMode(L_PIN, INPUT);        // 设置左传感器引脚为输入
  pinMode(M_PIN, INPUT);        // 设置中间传感器引脚为输入
  pinMode(R_PIN, INPUT);        // 设置右传感器引脚为输入
  pinMode(LED_PIN, OUTPUT);     // 设置 LED 引脚为输出
}

/* 功能：读取传感器值，输出串口信息，并控制 LED 灯 */
void loop() {
  valL = digitalRead(L_PIN);    // 读取左传感器值
  valM = digitalRead(M_PIN);    // 读取中间传感器值
  valR = digitalRead(R_PIN);    // 读取右传感器值

  Serial.print("left: ");       // 输出左传感器值
  Serial.print(valL);
  Serial.print(" middle: ");    // 输出中间传感器值
  Serial.print(valM);
  Serial.print(" right: ");     // 输出右传感器值
  Serial.println(valR);

  if (valL == LOW || valM == LOW || valR == LOW) {  // 任一传感器检测到信号
    digitalWrite(LED_PIN, HIGH);  // LED 灯灭
  } else {
    digitalWrite(LED_PIN, LOW);   // LED 灯亮
  }
}
```
